#ifndef __GPIO_H__
#define __GPIO_H__
#include "ADuCM4050.h"
#include "drivers/gpio/adi_gpio.h"
#include "sys/adi_ADuCM4050.h"

static uint32_t BITM_GPIO_CFG_PIN_Buf[16]=
{
	BITM_GPIO_CFG_PIN00,BITM_GPIO_CFG_PIN01,BITM_GPIO_CFG_PIN02,BITM_GPIO_CFG_PIN03,
	BITM_GPIO_CFG_PIN04,BITM_GPIO_CFG_PIN05,BITM_GPIO_CFG_PIN06,BITM_GPIO_CFG_PIN07,
	BITM_GPIO_CFG_PIN08,BITM_GPIO_CFG_PIN09,BITM_GPIO_CFG_PIN10,BITM_GPIO_CFG_PIN11,
	BITM_GPIO_CFG_PIN12,BITM_GPIO_CFG_PIN13,BITM_GPIO_CFG_PIN14,BITM_GPIO_CFG_PIN15
};

static uint32_t BITP_GPIO_CFG_PIN_Buf[16]=
{
	BITP_GPIO_CFG_PIN00,BITP_GPIO_CFG_PIN01,BITP_GPIO_CFG_PIN02,BITP_GPIO_CFG_PIN03,
	BITP_GPIO_CFG_PIN04,BITP_GPIO_CFG_PIN05,BITP_GPIO_CFG_PIN06,BITP_GPIO_CFG_PIN07,
	BITP_GPIO_CFG_PIN08,BITP_GPIO_CFG_PIN09,BITP_GPIO_CFG_PIN10,BITP_GPIO_CFG_PIN11,
	BITP_GPIO_CFG_PIN12,BITP_GPIO_CFG_PIN13,BITP_GPIO_CFG_PIN14,BITP_GPIO_CFG_PIN15
};

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))

#define GPIO0_MUL_Addr    (ADI_GPIO0_BASE+0) //0x40020000
#define P0_M(n)						BIT_ADDR(GPIO0_MUL_Addr,n)   

#define GPIO1_MUL_Addr    (ADI_GPIO1_BASE+0) //0x40020000
#define P1_M(n)						BIT_ADDR(GPIO1_MUL_Addr,n) 

#define GPIO2_MUL_Addr    (ADI_GPIO2_BASE+0) //0x40020000
#define P2_M(n)						BIT_ADDR(GPIO2_MUL_Addr,n) 

#define GPIO3_MUL_Addr    (ADI_GPIO3_BASE+0) //0x40020000
#define P3_M(n)						BIT_ADDR(GPIO3_MUL_Addr,n) 

#define GPIO0_ODR_Addr    (ADI_GPIO0_BASE+20) //0x40020014
#define GPIO0_IDR_Addr    (ADI_GPIO0_BASE+16) //0x40020010

#define GPIO1_ODR_Addr    (ADI_GPIO1_BASE+20) //0x40020054
#define GPIO1_IDR_Addr    (ADI_GPIO1_BASE+16) //0x40020050

#define GPIO2_ODR_Addr    (ADI_GPIO2_BASE+20) //0x40020094
#define GPIO2_IDR_Addr    (ADI_GPIO2_BASE+16) //0x40020090

#define GPIO3_ODR_Addr    (ADI_GPIO3_BASE+20) //0x400200D4
#define GPIO3_IDR_Addr    (ADI_GPIO3_BASE+16) //0x400200D0

#define P0_O(n)   	BIT_ADDR(GPIO0_ODR_Addr,n)  //输出 
#define P0_I(n)    	BIT_ADDR(GPIO0_IDR_Addr,n)  //输入 

#define P1_O(n)   	BIT_ADDR(GPIO1_ODR_Addr,n)  //输出 
#define P1_I(n)    	BIT_ADDR(GPIO1_IDR_Addr,n)  //输入 

#define P2_O(n)   	BIT_ADDR(GPIO2_ODR_Addr,n)  //输出 
#define P2_I(n)    	BIT_ADDR(GPIO2_IDR_Addr,n)  //输入 

#define P3_O(n)   	BIT_ADDR(GPIO3_ODR_Addr,n)  //输出 
#define P3_I(n)    	BIT_ADDR(GPIO3_IDR_Addr,n)  //输入 

#define Port0			(ADI_GPIO_PORT0)
#define Port1			(ADI_GPIO_PORT1)
#define Port2			(ADI_GPIO_PORT2)
#define Port3			(ADI_GPIO_PORT3)

#define Pin0			(ADI_GPIO_PIN_0)
#define Pin1			(ADI_GPIO_PIN_1)
#define Pin2			(ADI_GPIO_PIN_2)
#define Pin3			(ADI_GPIO_PIN_3)
#define Pin4			(ADI_GPIO_PIN_4)
#define Pin5			(ADI_GPIO_PIN_5)
#define Pin6			(ADI_GPIO_PIN_6)
#define Pin7			(ADI_GPIO_PIN_7)
#define Pin8			(ADI_GPIO_PIN_8)
#define Pin9			(ADI_GPIO_PIN_9)
#define Pin10			(ADI_GPIO_PIN_10)
#define Pin11			(ADI_GPIO_PIN_11)
#define Pin12			(ADI_GPIO_PIN_12)
#define Pin13			(ADI_GPIO_PIN_13)
#define Pin14			(ADI_GPIO_PIN_14)
#define Pin15			(ADI_GPIO_PIN_15)

void GPIO_OUT(unsigned int port,unsigned int pin,unsigned int flag);
void GPIO_BUS_OUT(unsigned int port,unsigned int num);

void P0_BUS_O(unsigned int num);
unsigned int P0_BUS_I(void);

void P1_BUS_O(unsigned int num);
unsigned int P1_BUS_I(void);

void P2_BUS_O(unsigned int num);
unsigned int P2_BUS_I(void);

void P3_BUS_O(unsigned int num);
unsigned int P3_BUS_I(void);
 
void mux_GPIO(uint8_t ports,uint8_t pins,uint8_t mux);

void mux_PINS(uint8_t ports,uint8_t pins,uint8_t mux);

#endif

